package com.chen.tliaswebtest.filter;

import com.chen.tliaswebtest.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus;

import java.io.IOException;

/**
 * @author chen
 * @version 1.0
 * @create_date 2025/7/26
 * 过滤器，实现访问统一拦截
 */
@Slf4j
//@WebFilter(urlPatterns = "/*") // 拦截所有请求
public class TliasFilter implements Filter {

    // 初始化方法，web服务器启动, 创建Filter实例时调用, 只调用一次
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain filterChain)
            throws IOException, ServletException {
        // 先将请求和响应转换成HttpServletRequest  和 HttpServletResponse
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        // 如果过滤器中不执行放行操作，过滤器拦截到请求之后，就不会访问对应的资源
        //  获取请求的uri，判断如果是登录，不需要校验令牌，直接放行
        if (!req.getRequestURL().toString().contains("login")) {
            // 获取请求的令牌
            String token = req.getHeader("token");
            // 判断令牌是否为空
            if (token == null) {
                log.warn("请求的令牌为空!");
                // 返回错误结果（未登录）
                res.setStatus(HttpStatus.SC_UNAUTHORIZED);
                return;
            }
            // 如果令牌解析失败
            try {
                JwtUtils.parseJWT(token);
            } catch (Exception e) {
                log.warn("令牌解析失败!");
                // 返回错误结果（未登录）
                res.setStatus(HttpStatus.SC_UNAUTHORIZED);
                return;
            }
        }
        // 放行
        log.info("令牌校验通过!");
        filterChain.doFilter(request, response);
    }

    // 销毁方法, web服务器关闭时调用, 只调用一次
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
